#include <memory>

using namespace std;

void f1()
{
    shared_ptr<int> sp(new int(42)); // 分配一个新对象
    // 这段代码抛出一个异常，且在 f 中未被捕获
} // 在函数结束时 shared_ptr 自动释放内存

void f2()
{
    int *ip = new int(42);      // 动态分配一个新对象
    // 这段代码抛出一个异常，且在 f 中未被捕获
    delete ip;                   // 在退出之前释放内存
}

struct destination;                 // 表示我们正在连接什么
struct connection;                  // 使用连接所需的信息
connection connect(destination*);   // 打开连接
void disconnect(connection);        // 关闭给定的连接
// void f(destination &d /* 其他参数 */)
// {
//     // 获得一个连接；记住使用完后要关闭它
//     // connection c = connect(&d);
//     // 使用连接
//     // 如果我们在 f 退出前忘记调用 disconnect，就无法关闭 c 了
// }

void f(destination &d /* 其他参数 */)
{
    // connection c = connect(&d);
    // 当 p 被销毁时，它不会对自己保存的指针执行 delete，而是调用 disconnect
    // shared_ptr<connection> p(&c, disconnect);
    // 使用连接
    // 当 f 退出时（即使是由于异常而退出），connection 会被正确关闭
}